
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>线程创建与管理 - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>线程创建与管理 - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">在Java中创建线程有哪两种主要方式？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">在Java中，创建线程主要通过两种方式：第一是继承 `Thread` 类并重写 `run()` 方法；第二是实现 `Runnable` 接口，然后将其实例传递给 `Thread` 类的构造函数。</div>
          </div>
          <div class="card-source">来源: 1. 线程的创建与启动流程</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">调用Java线程的 `start()` 方法和直接调用 `run()` 方法有什么本质区别？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">调用 `start()` 方法会由JVM创建一个新的操作系统级线程来执行 `run()` 方法中的代码，并将线程状态从 `NEW` 变为 `RUNNABLE`。而直接调用 `run()` 方法只是在当前线程中执行一个普通方法，并不会创建和启动新的线程。</div>
          </div>
          <div class="card-source">来源: 1.1 继承`Thread`类创建线程</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">为什么说通过实现 `Runnable` 接口创建线程比继承 `Thread` 类更加灵活？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">因为实现 `Runnable` 接口的方式允许线程任务的复用。同一个 `Runnable` 实例可以被传递给多个 `Thread` 对象，从而在多个线程中执行相同的任务，这提高了代码的灵活性和复用性。</div>
          </div>
          <div class="card-source">来源: 1.2 实现`Runnable`接口创建线程</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">根据 `Thread.State` 枚举，Java线程的生命周期包含哪些状态？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Java线程的生命周期状态包括：NEW (新建)、RUNNABLE (可运行)、BLOCKED (阻塞)、WAITING (等待)、TIMED_WAITING (计时等待) 和 TERMINATED (终止)。</div>
          </div>
          <div class="card-source">来源: 2.1 线程的不同状态</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">一个处于 `RUNNABLE` 状态的线程在什么情况下会分别进入 `BLOCKED` 和 `WAITING` 状态？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">当线程尝试进入一个同步方法或代码块但锁被其他线程持有时，它会进入 `BLOCKED` 状态。当线程调用了 `wait()` 方法后，它会释放锁并进入 `WAITING` 状态，等待其他线程的通知。</div>
          </div>
          <div class="card-source">来源: 2.1 线程的不同状态</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">请解释 `Thread.sleep()` 和 `Thread.yield()` 方法之间的区别。</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">`sleep()` 方法使当前线程在指定时间内暂停执行，进入 `TIMED_WAITING` 状态，并让出CPU资源。`yield()` 方法则是当前线程主动让出CPU资源，但其状态仍为 `RUNNABLE`，允许同等优先级的其他线程获得执行机会，但它也可能马上被再次调度。</div>
          </div>
          <div class="card-source">来源: 3.2 `sleep()`与`yield()`的使用</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">`ThreadPoolExecutor` 在处理新任务时的基本工作流程是怎样的？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">当一个新任务通过 `execute()` 方法提交时，如果线程池中的线程数小于核心线程数（`corePoolSize`），线程池会创建一个新线程（Worker）来执行任务。如果线程数已达到核心线程数，任务会被放入工作队列（`workQueue`）中等待空闲线程来执行。</div>
          </div>
          <div class="card-source">来源: 4.1 `ThreadPoolExecutor`类实现</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">`ThreadPoolExecutor` 的三个核心参数 `corePoolSize`、`maximumPoolSize` 和 `keepAliveTime` 分别代表什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">`corePoolSize`：核心线程池大小，即使线程空闲也保持活跃的线程数。<br>`maximumPoolSize`：最大线程池大小，线程池能容纳的最大线程数。<br>`keepAliveTime`：当线程数超过核心线程数时，多余的空闲线程在被销毁前可以存活的时间。</div>
          </div>
          <div class="card-source">来源: 4.2 线程池的参数与调优</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">在Java中，如何安全地中断一个线程？`interrupt()` 方法的工作原理是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">安全地中断线程应使用 `Thread.interrupt()` 方法。该方法会设置线程的中断状态。如果线程正处于 `sleep()` 或 `wait()` 等阻塞状态，它会抛出 `InterruptedException` 异常，线程可以在捕获该异常后执行清理工作并安全地终止。</div>
          </div>
          <div class="card-source">来源: 5.1 `interrupt()`方法的实现</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
